# 第一层循环迭代次数：
# 	初始化一个损失值F
# 	第二层属性值个数：
# 		对每个属性进行添加（减少）步长，增加和减少两个情况都要进行，看最后选择哪个情况
# 		计算修改之后的属性值乘以数据，即计算当前预测值
# 		计算预测值和实际值的差平方和B
# 		如果B小于F：
# 			则修改成功，保持修改、
# 		否则：
# 			不进行修改
import numpy
from matplotlib import pyplot
#前向逐步回归
def ssE(y1,y2):
    return numpy.sum((y1-y2)**2)
data=numpy.loadtxt('./ex0.txt',delimiter='\t')
X=data[:,:2]
Y=data[:,2]
epsilon=0.001#每次改变得大小
w=numpy.zeros(2)#先将初始权重设置为0
episode=5000#设置迭代次数
W=numpy.empty((episode,2))
for i in range(episode):
    lowestsse=numpy.inf
    new_w = w.copy()
    for j in range(2):#对于每个参数
        new_w = w.copy()
        for sign in [-1,1]:#增大或者减少
            new_w[j]=new_w[j]+sign*epsilon#应该用原来的值进行改变
            sse=ssE(Y,numpy.dot(X,new_w))
            if sse<lowestsse:
                lowestsse=sse
                w[j]=new_w[j]
            new_w[j] = new_w[j] - sign * epsilon#返回原来的值
        W[i,j]=w[j]
    print(W)
pyplot.plot(numpy.arange(5000),W[:,0],label='b')
pyplot.plot(numpy.arange(5000), W[:,1],label='a')
pyplot.xlabel('episode')
pyplot.legend()
pyplot.show()
